package com.ruoqing.gateway.config;



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
	* @author YaoXian
	* @title: SwaggerProvider
	* @projectName ruoxi-blog
	* @description: 若兮微服务 - 网关服务 - swaggerApi文档配置类
	* @date 2020-11-10 12:12
	*/

@Component
public class SwaggerProvider implements SwaggerResourcesProvider {
		
		/**
			* swagger2默认的url后缀
			*/
		private static final String SWAGGER2URL = "/v2/api-docs";
		
		/**
			* 网关路由
			*/
		private final RouteLocator routeLocator;
		
		/**
			* 网关应用名称
			*/
		@Value("${spring.application.name}")
		private String self;
		
		@Autowired
		public SwaggerProvider(RouteLocator routeLocator) {
				this.routeLocator = routeLocator;
		}
		
		@Override
		public List<SwaggerResource> get() {
				List<SwaggerResource> resources = new ArrayList<>();
				List<String> routeHosts = new ArrayList<>();
				// 获取所有可用的host：serviceId
				routeLocator.getRoutes().filter(route -> route.getUri().getHost() != null)
								.filter(route -> !self.equals(route.getUri().getHost()))
								.subscribe(route -> routeHosts.add(route.getUri().getHost()));
				// 记录已经添加过的server，存在同一个应用注册了多个服务在nacos上
				Set<String> dealed = new HashSet<>();
				routeHosts.forEach(instance -> {
						// 拼接url
						String url = "/" + instance + SWAGGER2URL;
						if (!dealed.contains(url)) {
								dealed.add(url);
								SwaggerResource swaggerResource = new SwaggerResource();
								swaggerResource.setUrl(url);
								swaggerResource.setName(instance);
								resources.add(swaggerResource);
						}
				});
				return resources;
		}
}